<?php

declare(strict_types=1);
/**
 * This file is part of Hyperf.
 *
 * @link     https://www.hyperf.io
 * @document https://hyperf.wiki
 * @contact  group@hyperf.io
 * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
 */

namespace App\Listener;

use Hyperf\Collection\Arr;
use Hyperf\Database\Events\QueryExecuted;
use Hyperf\Event\Annotation\Listener;
use Hyperf\Event\Contract\ListenerInterface;
use Hyperf\Logger\LoggerFactory;
use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;

#[Listener]
class DbQueryExecutedListener implements ListenerInterface
{
        /**
         * @var LoggerInterface
         */
        private $logger;

        public function __construct(ContainerInterface $container)
        {
                $this->logger = $container->get(LoggerFactory::class)->get('sql');
        }

        public function listen(): array
        {
                return [
                        QueryExecuted::class,
                ];
        }

        /**
         * @param QueryExecuted $event
         */
        public function process(object $event): void
        {
                if ($event instanceof QueryExecuted) {
                        $sql = $event->sql;
                        if (!Arr::isAssoc($event->bindings)) {
                                $position = 0;
                                foreach ($event->bindings as $value) {
                                        $position = strpos($sql, '?', $position);
                                        if ($position === false) {
                                                break;
                                        }
                                        $value = "'{$value}'";
                                        $sql = substr_replace($sql, $value, $position, 1);
                                        $position += strlen($value);
                                }
                        }
                        /*var_export($sql);
                        echo PHP_EOL;
                        echo PHP_EOL;
                        echo PHP_EOL;*/
                        $this->logger->info(sprintf('[%s] %s', $event->time, $sql));
                }
        }
}
